const WebSocket = require("ws");
let { Mysql, addSql, xiuSql, remSql, execute } = require("../../routers/db/db");
// webSocketServer 实例
// 服务器

let webSocketServer = new WebSocket.Server({ port: 3001 });
// 用户连接时触发
webSocketServer.on("connection", (client) => {
  // 每当有链接的时候 client都代表客户端实例
  // 有人发送过来消息(前台点击发送消息时触发)
  client.on("message", async (msg) => {
    let obj = JSON.parse(msg.toString());
    // 判断点击的是否是登录
    if (obj.type === "login") {
      // 接收到登录信息首先判断数据库有没有该用户
      if ((await getUserId(obj.uid)) === -1) {
        console.log("没有找到该用户");
        // 把账号保存到数据库
        console.log(obj);
        await addSql("user_message", {
          uid: obj.uid,
          username: `phone_${obj.phone}`,
          img: obj.img,
        });
        // 如果没有该用户说明没有注册登录
        // 并且保存该账号id
        client["uid"] = obj.uid;
      } else {
        console.log("找到该用户了");
        // 如果找到了说明登陆过,那就不需要再保存该账号了
        client["uid"] = await getUserId(obj.uid);
        return;
      }
    } else if (obj.type === "message") {
      console.log("已接收到您发送的消息");
      console.log(obj);
      // 获取登录状态
      let res = await getUserId(obj.uid);
      // 如果是单聊遍历所有客户端实例
      // 判断该用户登没登录
      console.log(res);
      if (res === -1) {
        // 说明没有注册-让用户注册
        console.log("1111111111111111111111111111");
        obj.code = "01";
        client.send(JSON.stringify(obj));
      } else {
        console.log("2222222222222222222222222222");
        let { uid, mess, createTime, Toid } = obj;
        console.log("Toid", Toid);
        if (!Toid) {
          await addSql("message", {
            uid,
            username: "测试用户",
            Toid: 35,
            mess,
            createTime,
            img: obj.img,
          });
        } else {
          await addSql("message", {
            uid,
            username: "管理员",
            Toid,
            mess,
            createTime,
          });
        }

        webSocketServer.clients.forEach(async (item, index) => {
          // 判断当前的信息是发给谁的
          console.log(item["uid"], "查找客户端实例指定用户实例");
          console.log(obj);
          if (!obj.Toid) {
            if (item["uid"] === 35) {
              // 查找到对应用户返回信息
              item.send(JSON.stringify(obj));
            } else if (item["uid"] === (await getUserId(obj.uid))) {
              // 给对方发送消息的同时也必须要给自己发一条
              item.send(JSON.stringify(obj));
            }
          } else {
            if (item["uid"] === obj.Toid) {
              // 查找到对应用户返回信息
              item.send(JSON.stringify(obj));
            } else if (item["uid"] === (await getUserId(obj.uid))) {
              // 给对方发送消息的同时也必须要给自己发一条
              item.send(JSON.stringify(obj));
            }
          }
        });
      }
    } else if (obj.type === "messages") {
      // 如果是群聊的话
      webSocketServer.clients.forEach((item, index) => {
        // 给全部用户发送消息
        item.send(JSON.stringify(obj));
      });
    }
  });
});

// 查找当前登录的用户id
async function getUserId(uid) {
  // 在数据库中查找到当前登录用户的id并存到当前实例里边用于判断
  let res = await execute(`SELECT uid from user_message where uid='${uid}'`);
  console.log(res);
  console.log(res.length);
  console.log(typeof res);
  return res.length !== 0 ? JSON.parse(JSON.stringify(res))[0].uid : -1;
}
